# include <stdio.h>
# define MaxSize 100 /*define是预处理命令 在c语言里面是定义一个常量，这里的常量是MaxSize 100是数组 一般定义这个数为最大*/
typedef int DataType ;/*定义了一个名为DataType的类型别名，将int类型定义为DataType。目的：使用list数组时，可以使用DataType类型来表示数组元素的数据类型，而不是直接使用int。*/
/*定义了一个名为SeqList的结构体类型。包含了一个数组成员list和一个整型成员size。*/
typedef struct{/**/
	DataType list[MaxSize];/*定义了一个名为SeqList的结构体类型。结构体中有两个成员，一个是数据类型为DataType的数组list，数组的长度由常量MaxSize决定；另一个是整型成员变量size，用来记录数组list中当前元素的个数。*/
	int size;
} 
SeqList;

/*初始化顺序表 L*/
void ListInitiate(SeqList* L) {
	L->size = 0;/*结构体指针L所指向的对象的size成员变量置为0，最后清空表。*/
}
/*返回顺序表 L 的当前数据元素个数*/
int ListLength(SeqList L)
	{	
	return L.size;
}


int ListInsert(SeqList* L, int i, DataType x) {
	/*在顺序表 L 的位置i（0<= i <= size ）前插入数据元素值x*/
	/*插入成功返回1，插入失败返回0*/
    /*输入参数需要定义指向SeqList类型的结构体指针L，要插入的元素x，位置索引i。*/
	int j;
	if (L->size >= MaxSize)/*这里的MaxSize就是上面定义的最大数组*/
     {
		printf("顺序表已满无法插入！\n");
		return 0;
	}
	else if (i <0 || i> L->size) {
		printf("参数i不合法！\n");/*小于0或大于L->size，越界，不合法*/
		return 0;
	}
	else/*插入操作没错误，用else语句来具体的插入操作。使用for（while循环也可以）循环遍历从L->size开始到i的元素，将每个元素向后移动一个位置，给要插入的数字腾出空位。*/
     {
		//此段程序有错误
		for (j = L->size;j > i; j--){
			L->list[j] = L->list[j - 1];
		}	
		L->list[i] = x;/*插入*/
		L->size++; /*元素个数加1*/
		return 1;
	}
	return 0;/*插入操作成功，函数返回1；否则返回0。*/
}


int ListDelete(SeqList* L, int i, DataType* x){
	/*删除顺序表 L 中位置i(0 <= i <= size-1）的数据元素值并存放到参数x中*/
	/*删除成功返回1，剖除失败返回0 */
	int j;
	if (L->size <= 0) {
		printf("顺序表已空无数据元素可删！ \n");
		return 0;
	}
	else if (i < 0 || i > L->size - 1) {
		printf("＂参数 i 不合法");
		return 0;
	}
	else{
		/*此段程序有错误*/
		*x = L->list[i]; /*保存删除的元素到参数x中*/
		for (j = i + 1; j <= L->size - 1; j++) {
			L->list[j-1] = L->list[j]; //依次前移
		}
		L->size--; /*数据元素个数减1*/
		return 1;
	}
}


int ListGet(SeqList L, int i, DataType* x){
	//取顺序表 L 中第 i 个数据元素的值存于x中，成功则返回1，失败返回0* / 
	/*输入参数包括一个SeqList类型的结构体L，要获取的元素的索引i，以及一个指向DataType类型的指针x，用于存储取得的元素值。*/
	if (i < 0 || i > L.size - 1) {
		printf("参数 i 不合法！ /n ");
		return 0;
	}
	
	else {
		*x = L.list[i];/*将顺序表L中索引i位置的元素值赋给指针x所指向的变量，将取得的元素的值存储到了指针x所指向的内存空间中。*/
		return 1;
	}
}


/*  

	有错误：实现函数体，实现在 L 内查找x。
	当x存在于L中时,返回x所在的索引的最小值；
	当 x不存在于于L中时，返回﹣1。
	
*/
int ListSearch(SeqList L, DataType x) /*输入参数包括一个SeqList类型的结构体L，表示要进行查找的顺序表，以及一个DataType类型的变量x，表示要查找的元素值。*/
{
	int i = 0;/*定义一个变量i，并初始化为0，用于记录当前遍历的元素索引。*/
	for(i=0;i < L.size;i++){/*用一个for循环遍历顺序表L中的所有元素。循环条件是i小于顺序表L的元素个数L.size。*/
		if(L.list[i] == x){/*L.list[i]等于要查找的元素值x，表示找到了指定元素，并返回其索引i。同时使用break语句跳出循环，结束查找操作。*/
			return i;
			break;
		}
		else 
			return -1;	/*返回-1，表示未找到指定元素*/
	}
}
/*具体例子*/
int main(int argc, char* argv[])/*C语言固定语句，用于接收命令行参数并执行程序的主要逻辑。程序执行成功时返回0，否则返回非0值。argc表示命令行参数的个数，是一个整数类型的变量；argv表示传递给程序的命令行参数，是一个字符指针数组。*/
 {
	SeqList myList;/*定义了一个名为myList的SeqList类型的变量。*/
	int i, x;
	ListInitiate(&myList);/*调用ListInitiate函数对顺序表（myList）进行初始化*/
	for (i = 0; i < 10; i++){
		ListInsert(&myList, i, i+1);//插入十个元素
	}
	
	ListDelete(&myList, 4, &x);//删除4号位置元素
	for (i = 0; i < ListLength(myList); i++) /*通过一个for循环遍历顺序表中的元素，调用ListGet函数获取每个位置的元素值，并依次打印输出。*/
    {
		//此段程序有一处错误/*上机的时候将printf语句改为printf("%d\n", x)，因为原来的printf("%d",x)这种格式printf语句使用了%d格式符来打印整数，但没有添加换行符。*/
		ListGet(myList,i, &x);/**/
		printf("%d",x);
	}
	  return 0;
}

